/*
- 将各段按l从小到大排序。
- 用双指针，L和R，遍历各个段。
- w[i]存储第i段属于第几分组。
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+100;
int T,n,w[N];
struct P{int l,r,id;}p[N];
bool cmp(P & a, P & b) {
    if(a.l == b.l) return a.r < b.r;
    return a.l < b.l;
}
int main() {
    cin >> T;
    while (T--)
    {
        cin >> n;
        for(int i=1;i<=n;i++) {
            cin >> p[i].l >> p[i].r;
            p[i].id = i;
            w[i] = 0;
        }
        sort(p+1,p+n+1,cmp);
        int L=p[1].l, R = p[1].r;
        int k=1;
        w[p[1].id] = 1;
        for(int i=2;i<=n;i++) {
            if(p[i].l>=L && p[i].r<=R) {
                w[p[i].id] = k;
            } else if(p[i].l<=R && p[i].r > R) {
                w[p[i].id] = k;
                R = p[i].r;
            } else if(p[i].l>R) {
                w[p[i].id] = ++k;
                L = p[i].l;
                R = p[i].r;
            }
        }
        if(k<2) {
            cout << -1 << endl;
            continue;
        }
        for(int i=1;i<=n;i++) {
            if(w[i] > 2) cout << 2 << " ";
            else  cout << w[i] << " ";
        }
        cout << endl;
    }
    return 0;
}